package core

import (
	"net"
)

// ========================================
// 服务端核心类型定义 - 被所有包共享
// ========================================

// ProtocolType 协议类型
type ProtocolType uint8

const (
	ProtocolHTTP ProtocolType = 1 // HTTP协议
	ProtocolTCP  ProtocolType = 2 // TCP协议
	ProtocolSSH  ProtocolType = 3 // SSH协议（预留）
	ProtocolRDP  ProtocolType = 4 // RDP协议（预留）
	ProtocolUDP  ProtocolType = 5 // UDP协议（预留）
)

// String 返回协议类型的字符串表示
func (p ProtocolType) String() string {
	switch p {
	case ProtocolHTTP:
		return "HTTP"
	case ProtocolTCP:
		return "TCP"
	case ProtocolSSH:
		return "SSH"
	case ProtocolRDP:
		return "RDP"
	case ProtocolUDP:
		return "UDP"
	default:
		return "UNKNOWN"
	}
}

// TunnelMessage 隧道消息结构
type TunnelMessage struct {
	Magic        uint32       // 魔数
	Version      uint32       // 版本
	MessageType  uint32       // 消息类型
	ProtocolType ProtocolType // 协议类型
	TunnelID     string       // 隧道ID (36字节 UUID)
	RequestID    string       // 请求ID (36字节 UUID)
	ConnectionID string       // 连接ID (36字节 UUID)
	BodyLength   uint64       // Body 长度
	Reserved     [12]byte     // 保留字段
	Body         []byte       // 消息体
}

// 协议常量
const (
	ProtocolVersion uint32 = 0x00000002 // 协议版本
	HeaderSize      int    = 144        // 消息头大小

	// 消息类型
	MessageTypeRequest  uint32 = 1 // 请求消息
	MessageTypeResponse uint32 = 2 // 响应消息
	MessageTypeError    uint32 = 3 // 错误消息

	// 分块相关
	ChunkSize uint64 = 32 * 1024 // 32KB
)

// ProtocolListener 协议监听器接口
// 所有协议实现都必须实现此接口
type ProtocolListener interface {
	// Start 启动监听器
	Start() error

	// Stop 停止监听器
	Stop() error

	// GetProtocolType 获取协议类型
	GetProtocolType() ProtocolType

	// GetPort 获取监听端口
	GetPort() string

	// HandleConnection 处理连接（由监听器调用）
	HandleConnection(conn net.Conn)
}

// ProtocolStats 协议统计信息
type ProtocolStats struct {
	TotalRequests  int64 // 总请求数
	ActiveRequests int64 // 当前活跃请求数
	TotalBytesSent int64 // 总发送字节数
	TotalBytesRecv int64 // 总接收字节数
	SuccessCount   int64 // 成功次数
	ErrorCount     int64 // 错误次数
}

// ForwardContext 转发上下文（传递给转发器）
type ForwardContext struct {
	TunnelID   string        // 隧道ID
	RequestID  string        // 请求ID
	ClientConn net.Conn      // 客户端连接
	QUICServer QUICForwarder // QUIC服务器接口（用于转发）
}

// QUICForwarder QUIC转发器接口
type QUICForwarder interface {
	// ForwardHTTPRequest 转发HTTP请求（旧方法，保留兼容性）
	ForwardHTTPRequest(tunnelID, requestID string, httpReq []byte) ([]byte, error)

	// ForwardHTTPRequestStream 流式转发HTTP请求（支持大文件）
	ForwardHTTPRequestStream(tunnelID, requestID string, httpReq []byte, responseWriter net.Conn) error

	// ForwardTCPConnection 转发TCP连接
	ForwardTCPConnection(tunnelID, requestID string, clientConn net.Conn) error
}
